






<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

//php中数字签名与校验

//1. 先用php生成一对公钥和私钥

$res = openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $privkey);
 
// Get public key
$pubkey = openssl_pkey_get_details($res);

$pubkey = $pubkey["key"];

var_dump($privkey);
file_put_contents('SSL/private.pem', $privkey);
file_put_contents('SSL/public.pem', $pubkey);


//2. 保存好自己的私钥，把公钥可以公开给别人。如果需要对某数据进行签名，证明那数据是从你这里发出的，就需要用私钥：

$res = openssl_pkey_get_private($privkey);

if (openssl_sign('hello', $out, $res))
$sign = base64_encode($out);

//上例中 $pri  为自己的私钥，'hello'  为待签名的数据，如果签名成功，最后输出为base64编码后的签名，如：
//
//j19H+C/NQEcyowezOQ+gmGi2UoPJNXyJ+KwpkEzJ5u4qaRD3cY4qhfFfIosypypwJTJ4LjRYOIPNQMQm6ICj2nMdGfn/p/pp7il+xGz2aUWdOXkJFgIc/PGC95C9sLH04Tc6QSuV5IMd9rjBjyv+ieokMLFm9cmtN2hGag9vq1s=
//
//3. 别人收到你的数据 'hello' 和签名字串，想验证这是从你发来的数据的话，用你公开的公钥验证：

$sign = base64_decode($sign);

$res = openssl_pkey_get_public($pubkey);

if (openssl_verify('hello', $sign, $res) === 1){
    echo 1;
}





